package ooap;

/**
 * @author : niu niu
 * @version : 1.0.0
 * @date : 2022/8/26 9:49
 * 使用类来定义学生
 *
 *  构造方法：1.类中的构造方法必须和类名相同，（alt+insert快捷生成）
 *           2.没有返回值类型（不等于Void）
 *           3.构造方法可以重载，在产生对象时，由编译器自动调用构造方法产生对象,
 *           4.并且在整个对象的生命周期内只调用一次
 *
 *  作用：产生对象，对类的属性进行初始化赋值
 *
 *  注意事项：
 *      自己定义过构造函数，编译器不再产生默认的无参构造。若要使用，需要自己定义无参构造
 *      若没有自己定义，编译器自己生成默认的无参构造。
 *
 *  构造方法调用时背后内存的变化情况--->JVM运行细节
 *      a)JVM会判断当前要产生的Student对象所在的Student类是否被加载到JVM中（Student.class）,若还没加载，先加载类（Student.class）
 *      b)new关键字，先分配对象的内存空间 （到底开辟多大，要看这个对象内部包含具体成员变量有多少，就开辟多大空间）
 *      c)处理并发线程安全问题（JVM考虑多线程问题）
 *      d)为分配的空间进行属性初始化操作
 *
 *  this 关键字 ：
 *   1.修饰属性  表示类中的成员变量
 *      this.属性名
 *   2.修饰方法
 *      a)this.方法名
 *      b)this()表示调用类中的构造方法
 *              ①this调用构造方法必须放在构造方法的首行调用
 *              ②对构造方法的调用比可以成环装，必须是线性
 *   3.表示当前对象的引用
 *      当前是通过哪个对象调用的属性和方法，就表示那个对象
 *
 *  程序就近原则：从调用处向上寻找最近的同名变量使用
 *
 *
 */
public class Student {
    //属性：
    //姓名
    public String name;
    //年龄
    public int age;
    //性别
    public String sex;
    //学分
    public int grade;

    //方法：
    //构造方法：
    public Student(String name,int age,String sex,int grade){
        System.out.println("Student  有参构造");
        this.name = name;
        this.age = age;
        this.sex =sex;
        this.grade = grade;
    }
    public  Student(){
        System.out.println("Student  无参构造");
    }
    //来上课
    public void attendClass(){
        System.out.println(name+"上课认真听讲~");
    }
    //写作业
    public void doHomework(){
        System.out.println(name+"好好完成作业~");
    }
    //要考试
    public void examination(){
        System.out.println(name + "考试得高分~");
    }

    public static void main(String[] args) {
//        Student student1 = new Student("牛牛",18,"男",100);
//        Student student2 = new Student();

    }
}
